package org.rcy.framework.thrift.metadata;

import org.apache.thrift.protocol.TType;
import org.rcy.framework.thrift.ReflectionUtils;

import java.lang.reflect.Type;
import java.nio.ByteBuffer;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ThriftType {

	private static Map<Class<?>, Byte> typeMap = new HashMap();

	static {
		typeMap.put(boolean.class, TType.BOOL);
		typeMap.put(Boolean.class, TType.BOOL);
		typeMap.put(Byte.class, TType.BYTE);
		typeMap.put(byte.class, TType.BYTE);
		typeMap.put(double.class, TType.DOUBLE);
		typeMap.put(Double.class, TType.DOUBLE);
		typeMap.put(Enum.class, TType.ENUM);
		typeMap.put(short.class, TType.I16);
		typeMap.put(Short.class, TType.I16);
		typeMap.put(int.class, TType.I32);
		typeMap.put(Integer.class, TType.I32);
		typeMap.put(long.class, TType.I64);
		typeMap.put(Long.class, TType.I64);
		typeMap.put(Date.class, TType.I64);
		typeMap.put(List.class, TType.LIST);
		typeMap.put(Set.class, TType.SET);
		typeMap.put(Map.class, TType.MAP);
		typeMap.put(String.class, TType.STRING);
		typeMap.put(ByteBuffer.class, TType.STRING);// binary类型
	}

	public static byte getType(Type original) {
		Class<?> type = ReflectionUtils.resolveType(original);

		Byte thriftType = typeMap.get(type);
		if (thriftType != null) {
			return thriftType;
		}

		if (Enum.class.isAssignableFrom(type)) {
			return TType.ENUM;
		}

		if (List.class.isAssignableFrom(type)) {
			return TType.LIST;
		}

		if (Set.class.isAssignableFrom(type)) {
			return TType.SET;
		}

		if (Map.class.isAssignableFrom(type)) {
			return TType.MAP;
		}
		// 以上类型都不匹配则返回STRUCT类型
		return TType.STRUCT;
	}
}